﻿using System.Collections.Generic;
using HK.Core.Common.Data;
using HK.Core.Common.Protocol;
using HK.Core.Common.Protocol.Data;

namespace HK.Core.Network.Download.Protocol.Data
{

    /// <summary>
    /// 下载状态
    /// </summary>
    public enum DownloadStatus
    {
        None = 0x00000000,
        Downloading = 0x00000001,
        Downloaded = 0x00000002,
        Decompressing = 0x00000004,
        Decompressed = 0x00000008
    }
    
    /// <summary>
    /// 接口 : 下载信息
    /// </summary>
    public interface IDownloadInfo : IJsonData
    {
        
        /// <summary>
        /// Id
        /// </summary>
        int Id { get; set; }
        
        /// <summary>
        /// 下载地址
        /// </summary>
        string Url { get; }
        
        /// <summary>
        /// 文件名
        /// </summary>
        string FileName { get; }

        /// <summary>
        /// 版本
        /// </summary>
        string Version { get; }
        
        /// <summary>
        /// 下载保存路径
        /// <para>* 该路径为，下载临时保存路径。下载成功并通过文件校验后，将拷贝到真正的保存路径。即:SavePath</para>
        /// </summary>
        string DownloadPath { get; }
        
        /// <summary>
        /// 保存路径
        /// </summary>
        string SavePath { get; }
        
        /// <summary>
        /// 文件大小
        /// <para>* 单位:Byte</para>
        /// </summary>
        long Size { get; set; }
        
        /// <summary>
        /// 校验码 - Crc
        /// </summary>
        long CrcCheckCode { get; }
        
        /// <summary>
        /// 校验码 - Md5
        /// </summary>
        string Md5CheckCode { get; }
        
        /// <summary>
        /// 下载中标志位
        /// </summary>
        bool Downloading { get; set; }
        
        /// <summary>
        /// 下载完成标志位
        /// </summary>
        bool Downloaded { get; set; }
        
        /// <summary>
        /// 下载完成标志位
        /// <para>* 自身以及所包含补丁全部下载完成</para>
        /// </summary>
        bool AllDownloaded { get; }
        
        /// <summary>
        /// 解压中
        /// </summary>
        bool Decompressing  { get; set; }
        
        /// <summary>
        /// 已解压
        /// </summary>
        bool Decompressed { get; set; }
        
        /// <summary>
        /// 下载耗时
        /// <para>* 单位:毫秒</para>
        /// </summary>
        long CostTime { get; set; }

#region Patch

        /// <summary>
        /// 补丁
        /// </summary>
        IDownloadInfo Patch { get; }

        /// <summary>
        /// 设定补丁
        /// </summary>
        /// <param name="iPatch">补丁</param>
        void SetPatch(IDownloadInfo iPatch);

#endregion

        /// <summary>
        /// 总个数
        /// <para>* 自身以及包含补丁的个数</para>
        /// </summary>
        int TotalCount { get; }
        
        /// <summary>
        /// 总大小
        /// <para>* 自身以及包含补丁的数据大小(单位:Byte)</para>
        /// </summary>
        long TotalSize { get; }
        
        /// <summary>
        /// 已下载数量
        /// <para>* 自身以及所包含补丁数量总和</para>
        /// </summary>
        int DownloadedCount { get; }
        
        /// <summary>
        /// 已下载的大小
        /// <para>* 自身以及包含补丁的数据大小(单位:Byte)</para>
        /// </summary>
        long DownloadedSize { get; }

    }

    /// <summary>
    /// 接口 : 下载速度计算单元
    /// </summary>
    public interface IDownloadSpeedUnit : IJsonData
    {
        
        /// <summary>
        /// Point Key
        /// </summary>
        string Key { get; }
        
        /// <summary>
        /// 已下载的大小
        /// <para>* 单位:Byte</para>
        /// </summary>
        long Size { get; }
        
        /// <summary>
        /// 时间
        /// <para>单位 : 毫秒数</para>
        /// </summary>
        long TimeTick { get; }
    }

    /// <summary>
    /// 接口 : 下载速度
    /// </summary>
    public interface IDownloadSpeed<TUnit> : IJsonData
        where TUnit : JsonData, IDownloadSpeedUnit
    {
        
        /// <summary>
        /// 动态采样数
        /// </summary>
        int SampleCount { get; }
        
        /// <summary>
        /// 速度点
        /// </summary>
        List<TUnit> SpeedPoints { get; }
        
        /// <summary>
        /// 总耗时
        /// <para>* 单位:毫秒</para>
        /// </summary>
        long TotalCostTime { get; }

        /// <summary>
        /// 追加速度单位节点
        /// </summary>
        /// <param name="iPoint">速度节点</param>
        void AddSpeedPoint(TUnit iPoint);

        /// <summary>
        /// 计算下载速度
        /// <para>* 单位:Byte/s</para>
        /// </summary>
        /// <returns>下载速度</returns>
        float CalcDownloadSpeed();
    }
}
